package com.zh.note.leetcode.linkedList;

import com.zh.note.leetcode.model.ListNode;

/**
 * 203. 移除链表元素
 */
public class LC_203_RemoveElements {
    /**
     * 原链表删除法
     */
    public ListNode removeElements(ListNode head, int val) {
        // 移除头节点
        while (head != null && head.val == val) {
            head = head.next;
        }
        // 定义临时指针
        ListNode cur = head;
        // 删除节点
        while (cur != null && cur.next != null) {
            if (cur.next.val == val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }

        }
        return head;

    }

    /**
     * 虚拟头节点法（推荐）
     *
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements2(ListNode head, int val) {
        // 定义虚拟头节点
        ListNode dummy = new ListNode();
        dummy.next = head;
        // 定义临时指针用来遍历链表，不能直接用head 否则最后无法返回删除后的链表
        ListNode cur = dummy;
        while (cur.next != null) {
            if (cur.next.val == val) {
                cur.next = cur.next.next;
            }else {
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}
